package com.gist.cithub.service.utils;

import java.io.*;
import java.net.*;

public class HttpRequestor {

  private String charset = "utf-8";
  private Integer connectTimeout = null;
  private Integer socketTimeout = null;
  private String proxyHost = null;
  private Integer proxyPort = null;

  /**
   * Do GET request
   * @param url
   * @return
   * @throws Exception
   * @throws IOException
   */
  public String doGet(String url) throws Exception {

	URL localURL = new URL(url);

	URLConnection connection = this.openConnection(localURL);
	HttpURLConnection httpURLConnection = (HttpURLConnection)connection;

	httpURLConnection.setRequestProperty("Accept-Charset", charset);
	httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

	InputStream inputStream = null;
	InputStreamReader inputStreamReader = null;
	BufferedReader reader = null;
	StringBuffer resultBuffer = new StringBuffer();
	String tempLine = null;
	//响应失败
	if (httpURLConnection.getResponseCode() >= 300) {
	  throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
	}

	try {
	  inputStream = httpURLConnection.getInputStream();
	  inputStreamReader = new InputStreamReader(inputStream);
	  reader = new BufferedReader(inputStreamReader);

	  while ((tempLine = reader.readLine()) != null) {
		resultBuffer.append(tempLine);
	  }

	} finally {

	  if (reader != null) {
		reader.close();
	  }

	  if (inputStreamReader != null) {
		inputStreamReader.close();
	  }

	  if (inputStream != null) {
		inputStream.close();
	  }

	}

	return resultBuffer.toString();
  }

  /**
   * Do POST request
   * @param url
   * @param parameters
   * @return
   * @throws Exception
   */
  public String doRequest(String type, String url, StringBuffer parameters) throws Exception {

	/* Translate parameter map to parameter date string */

	URL localURL = new URL(url);

	URLConnection connection = this.openConnection(localURL);
	HttpURLConnection httpURLConnection = (HttpURLConnection)connection;

	httpURLConnection.setDoOutput(true);
	httpURLConnection.setRequestMethod(type);
	httpURLConnection.setRequestProperty("Accept-Charset", charset);
	httpURLConnection.setRequestProperty("Content-Type", "application/json");
	httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameters.length()));

	OutputStream outputStream = null;
	OutputStreamWriter outputStreamWriter = null;
	InputStream inputStream = null;
	InputStreamReader inputStreamReader = null;
	BufferedReader reader = null;
	StringBuffer resultBuffer = new StringBuffer();
	String tempLine = null;

	try {
	  outputStream = httpURLConnection.getOutputStream();
	  outputStreamWriter = new OutputStreamWriter(outputStream);

	  outputStreamWriter.write(parameters.toString());
	  outputStreamWriter.flush();
		System.out.println(httpURLConnection.getResponseCode());
	  //响应失败
	  if (httpURLConnection.getResponseCode() >= 300) {
		throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
	  }
	  //接收响应流
	  inputStream = httpURLConnection.getInputStream();
	  inputStreamReader = new InputStreamReader(inputStream);
	  reader = new BufferedReader(inputStreamReader);

	  while ((tempLine = reader.readLine()) != null) {
		resultBuffer.append(tempLine);
	  }


	} finally {

	  if (outputStreamWriter != null) {
		outputStreamWriter.close();
	  }

	  if (outputStream != null) {
		outputStream.close();
	  }

	  if (reader != null) {
		reader.close();
	  }

	  if (inputStreamReader != null) {
		inputStreamReader.close();
	  }

	  if (inputStream != null) {
		inputStream.close();
	  }


	}
	return resultBuffer.toString();

  }

  private URLConnection openConnection(URL localURL) throws IOException {
	URLConnection connection;
	if (proxyHost != null && proxyPort != null) {
	  Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
	  connection = localURL.openConnection(proxy);
	} else {
	  connection = localURL.openConnection();
	}
	return connection;
  }

  /**
   * Render request according setting
   * @param
   */
  private void renderRequest(URLConnection connection) {

	if (connectTimeout != null) {
	  connection.setConnectTimeout(connectTimeout);
	}

	if (socketTimeout != null) {
	  connection.setReadTimeout(socketTimeout);
	}

  }

  /*
   * Getter & Setter
   */
  public Integer getConnectTimeout() {
	return connectTimeout;
  }

  public void setConnectTimeout(Integer connectTimeout) {
	this.connectTimeout = connectTimeout;
  }

  public Integer getSocketTimeout() {
	return socketTimeout;
  }

  public void setSocketTimeout(Integer socketTimeout) {
	this.socketTimeout = socketTimeout;
  }

  public String getProxyHost() {
	return proxyHost;
  }

  public void setProxyHost(String proxyHost) {
	this.proxyHost = proxyHost;
  }

  public Integer getProxyPort() {
	return proxyPort;
  }

  public void setProxyPort(Integer proxyPort) {
	this.proxyPort = proxyPort;
  }

  public String getCharset() {
	return charset;
  }

  public void setCharset(String charset) {
	this.charset = charset;
  }

}
